// webSocket
; (function () {
  const webSocket = require('ws')
  const server = new webSocket.Server({ port: 8888 })
  server.on('open', onOpen)
  server.on('close', onClose)
  server.on('error', onError)
  server.on('connection', onConnection)

  function onOpen(e) {
    console.log('open');
  }
  function onClose(e) {
    console.log('close');
  }
  function onError(e) {
    console.log('errot');
  }
  function onConnection(ws, req) {
    console.log('connection<已连接>');
    console.log('ip', req.connection.remoteAddress);
    // 连接成功后监听message事件，收到信息时发送给客户端
    ws.on('message', function (message) {

      // const { msg, time, username } = JSON.parse(message)
      let data = JSON.parse(message)
      // data.req = req.url
      // data.ws = ws

      this.user = data
      console.log(this.user);

      radio(data, true, ws)
    })
    // 当一个 WebSocket 连接被关闭时触发
    ws.on('close', function (close) {
      console.log(this?.user?.username, '断开了连接');
      if (this.user) {
        // 传入退出的用户名和退出标识
        radio({ username: this.user.username, exit: 1 })
      }
    })
    // ws.on('onopen', function (close) {
    //   console.log('打开连接');
    //   if (this.user) {
    //     radio({ username: '打开了', exit: 1 })
    //   }
    // })
  }
  // 广播
  function radio(data, status = false, ws) {

    data.onlineUsers = [...server.clients].length // 客户端连接数
    data = JSON.stringify(data)

    server.clients.forEach((client, isBinary) => {

      if (status) {
        // 全部广播
        if (client.readyState === webSocket.OPEN) client.send(data)
      } else {
        // 屏蔽自己，发起人不接收
        if (client !== ws && client.readyState === webSocket.OPEN) client.send(data)
      }

    });
  }
})();




// 参考
// ; (function () {
  //https://github.com/websockets/ws/blob/master/doc/ws.md#new-wsserveroptions-callback
  // var WebSocketServer = require('ws').Server,
  //   wss = new WebSocketServer({
  //     port: 8888, //监听接口
  //     verifyClient: socketVerify //可选，验证连接函数
  //   });
  // function socketVerify(info) {
  //   console.log(info.origin);
  //   console.log(info.req.t);
  //   console.log(info.secure);
  //   // console.log(info.origin);
  //   // var origin = info.origin.match(/^(:?.+\:\/\/)([^\/]+)/);
  //   //if (origin.length >= 3 && origin[2] == "blog.luojia.me") {
  //   //  return true; //如果是来自blog.luojia.me的连接，就接受
  //   //}
  //   // console.log("连接",origin[2]);
  //   return true; //否则拒绝
  //   //传入的info参数会包括这个连接的很多信息，你可以在此处使用console.log(info)来查看和选择如何验证连接
  // }
  // //广播
  // wss.broadcast = function broadcast(s,ws) {
  //   // console.log(ws);
  //   // debugger;
  //   wss.clients.forEach(function each(client) {
  //     // if (typeof client.user != "undefined") {
  //       if(s == 1){
  //         client.send(ws.name + ":" + ws.msg);
  //       }
  //       if(s == 0){
  //         client.send(ws + "退出聊天室");
  //       }
  //     // }
  //   });
  // };
  // // 初始化
  // wss.on('connection', function(ws) {
  //   // console.log(ws.clients.session);
  //   // console.log("在线人数", wss.clients.length);
  //   ws.send('你是第' + [...wss.clients].length + '位');
  //   // 发送消息
  //   ws.on('message', function(jsonStr,flags) {
  //     var obj = eval('(' + jsonStr + ')');
  //     // console.log(obj);
  //     this.user = obj;
  //     if (typeof this.user.msg != "undefined") {
  //       wss.broadcast(1,obj);
  //     }
  //   });
  //   // 退出聊天
  //   ws.on('close', function(close) {
  //     try{
  //       wss.broadcast(0,this.user.name);
  //     }catch(e){
  //       console.log('刷新页面了');
  //     }
  //   });
  // });
// })()
